home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / inn1.000 / inn1.4sec-linux-src.tar / inn / samples / newgroup < prev    next >
Text File  |  1993-03-18  |  3KB  |  157 lines

  1. #! /bin/sh
  2. ##  $Revision: 1.20 $
  3. ##  Newgroup control-message handler
  4.  
  5. PROG=newgroup
  6. ##  Some shells don't pass in $* unless we explicitly pass it in here.
  7. ##  =()<. @<_PATH_PARSECTL>@ "$@">()=
  8. . /news/bin/control/parsecontrol "$@"
  9.  
  10. ##  Valid parameters and group name?
  11. case "$#" in
  12. 1|2)
  13.     ;;
  14. *)
  15.     ${WRITELOG} ${LOGFILE} "Unparseable newgroup by ${FROM}" <${ARTICLE}
  16.     exit
  17.     ;;
  18. esac
  19. case "$1" in
  20. *[\ \    /:]*)
  21.     ${WRITELOG} ${LOGFILE} "Unsafe newgroup by ${FROM}" <${ARTICLE}
  22.     exit
  23.     ;;
  24. esac
  25.  
  26. ##  Make sure article is approved.
  27. ${SED} -e '/^$/q' <${ARTICLE} >${TEMP}
  28. grep '^Approved:' <${TEMP} >/dev/null 2>&1 || {
  29.     rm -f ${TEMP}
  30.     ${WRITELOG} ${LOGFILE} "Unapproved newgroup by ${FROM}" <${ARTICLE}
  31.     exit
  32. }
  33. rm -f ${TEMP}
  34.  
  35. case "$2" in
  36. [Mm]*)
  37.     set $1 m
  38.     ;;
  39. *)
  40.     set $1 y
  41.     ;;
  42. esac
  43.  
  44. ##  Kill the chefs; from <wesommer@athena.mit.edu>.
  45. ##  That is, turn "alt.foo.bar.bar.bar" into an "x" group.
  46. #case `echo $1 | awk -F. '{
  47. #    if (NF > 1 && $NF != "misc") {
  48. #        if (NF > 5 || $NF == $(NF - 1) || $(NF - 1) == $(NF - 2)) {
  49. #        print "bozo";
  50. #        }
  51. #    }
  52. #    }'` in
  53. #bozo*)
  54. #      set $1 x
  55. #      ;;
  56. #esac
  57.  
  58. ##  Compare group against active file.
  59. SUFFIX=""
  60. LINE=`grep "^$1 " <${ACTIVE} 2>/dev/null`
  61. case "${LINE}" in
  62. "")
  63.     ##  New group.
  64.     WORD=created
  65.     ;;
  66. "$1 "*" $2")
  67.     ##  Exact match; ignore it.
  68.     exit
  69.     ;;
  70. "$1 "*" ="*|"$1 "*" x"|"$1 "*" j")
  71.     ${WRITELOG} ${LOGFILE} "Rejected special newsgroup ($1) by ${FROM}" \
  72.         <${ARTICLE}
  73.     exit
  74.     ;;
  75. *)
  76.     case "$2" in
  77.     m)
  78.     WORD="made moderated"
  79.     SUFFIX=" (Moderated)"
  80.     ;;
  81.     y)
  82.     WORD="made unmoderated"
  83.     ;;
  84.     esac
  85.     ;;
  86. esac
  87.  
  88. case ${ACTION} in
  89. mail)
  90.     P1=$1
  91.     P2=$2
  92.     export FROM WORD NEWSBIN P1 P2 ARTICLE
  93.     (
  94.     echo "${FROM} requested that $1 be ${WORD}."
  95.     echo 'To do this, type the following:'
  96.     echo "    ${NEWSBIN}/ctlinnd newgroup ${P1} ${P2} ${FROM}"
  97.     echo ''
  98.     echo 'The original article was:'
  99.     cat ${ARTICLE}
  100.     ) | ${WRITELOG} ${LOGFILE} "newgroup $1 $2 ${FROM}"
  101.     exit
  102.     ;;
  103. logit)
  104.     ${WRITELOG} ${LOGFILE} "skipping newgroup $1 $2 ${FROM} (would be ${WORD})" \
  105.     <${ARTICLE}
  106.     exit
  107.     ;;
  108. esac
  109.  
  110. ##  Do the work.
  111. ctlinnd -s newgroup $1 $2 "${FROM}"
  112. ${WRITELOG} ${LOGFILE} "newgroup $1 $2 ${WORD} ${FROM}" <${ARTICLE}
  113.  
  114. ##  Get a description of the newsgroup; first from the article, and
  115. ##  then from the newsgroups file.
  116. DESC=`${SED} <${ARTICLE} -n -e "
  117. :top
  118. /^For your newsgroups file:\$/b scan
  119. n
  120. b top
  121. :scan
  122. n
  123. /$1[     ]/ {
  124. p
  125. q
  126. }
  127. b scan"`
  128. test -z "${DESC}" && {
  129.     DESC=`${EGREP} "^$1    " ${NEWSGROUPS} | ${SED} "s/[     ]*(Moderated)//"`
  130.     test -z "${DESC}" && DESC="$1    ?"
  131. }
  132. DESC="${DESC}${SUFFIX}"
  133.  
  134. ##  Lock so we can update newsgroups
  135. LOCK=${LOCKS}/LOCK.newsgroups
  136. PID=$$
  137. TRY=0
  138. MAXTRY=60
  139. export LOCK MAXTRY PID LOGFILE TRY
  140. while [ ${TRY} -lt ${MAXTRY} ]; do
  141.     shlock -p ${PID} -f ${LOCK} && break
  142.     sleep 2
  143.     TRY=`expr ${TRY} + 1`
  144. done
  145.  
  146. ##  If we got the lock, update the file; otherwise, give up.
  147. test ${TRY} -lt ${MAXTRY} || {
  148.     echo "Newgroup cannot update newsgroups.  Locked by" `cat ${LOCK}` 1>&2
  149.     exit
  150. }
  151.  
  152. ${EGREP} -v "^$1[    ]" <${NEWSGROUPS} >${TEMP}
  153. cat ${TEMP} >${NEWSGROUPS}
  154. echo "${DESC}" >>${NEWSGROUPS}
  155. rm ${TEMP} ${LOCK}
  156. exit
  157.